/**
 * WMS表单组件类型定义
 *
 * 定义表单相关的接口、类型和常量
 * 提供完整的表单功能类型支持
 */

import type {
  WmsBaseComponentProps,
  WmsLoadingProps,
  WmsEventHandlers,
} from "./common";

/**
 * 表单字段类型枚举
 */
export type WmsFormFieldType =
  | "input" // 文本输入
  | "textarea" // 多行文本
  | "password" // 密码输入
  | "number" // 数字输入
  | "select" // 下拉选择
  | "multi-select" // 多选下拉
  | "radio" // 单选按钮
  | "checkbox" // 复选框
  | "switch" // 开关
  | "slider" // 滑块
  | "rate" // 评分
  | "date" // 日期选择
  | "datetime" // 日期时间选择
  | "time" // 时间选择
  | "daterange" // 日期范围
  | "datetimerange" // 日期时间范围
  | "timerange" // 时间范围
  | "upload" // 文件上传
  | "image-upload" // 图片上传
  | "cascader" // 级联选择
  | "tree-select" // 树形选择
  | "color" // 颜色选择
  | "autocomplete" // 自动完成
  | "mention" // 提及
  | "editor" // 富文本编辑器
  | "code-editor" // 代码编辑器
  | "json-editor" // JSON编辑器
  | "custom" // 自定义组件
  | "divider" // 分割线
  | "text" // 纯文本显示
  | "html"; // HTML显示

/**
 * 表单验证规则类型
 */
export interface WmsFormRule {
  /** 是否必填 */
  required?: boolean;
  /** 错误消息 */
  message?: string;
  /** 验证触发方式 */
  trigger?: "blur" | "change" | "submit" | string[];
  /** 数据类型 */
  type?:
    | "string"
    | "number"
    | "boolean"
    | "method"
    | "regexp"
    | "integer"
    | "float"
    | "array"
    | "object"
    | "enum"
    | "date"
    | "url"
    | "hex"
    | "email";
  /** 最小长度/值 */
  min?: number;
  /** 最大长度/值 */
  max?: number;
  /** 字符串长度 */
  len?: number;
  /** 正则表达式 */
  pattern?: RegExp;
  /** 枚举值 */
  enum?: any[];
  /** 转换函数 */
  transform?: (value: any) => any;
  /** 自定义验证函数 */
  validator?: (
    rule: WmsFormRule,
    value: any,
    callback: (error?: Error | string) => void,
    source?: any,
    options?: any,
  ) => void;
  /** 异步验证函数 */
  asyncValidator?: (
    rule: WmsFormRule,
    value: any,
    callback: (error?: Error | string) => void,
    source?: any,
    options?: any,
  ) => Promise<void>;
  /** 验证级别 */
  level?: "error" | "warning";
  /** 白名单(跳过验证的值) */
  whitespace?: boolean;
  /** 字段数组验证规则 */
  fields?: Record<string, WmsFormRule | WmsFormRule[]>;
  /** 默认字段规则 */
  defaultField?: WmsFormRule;
}

/**
 * 表单字段配置类型
 */
export interface WmsFormField {
  /** 字段名 */
  name: string;
  /** 字段标签 */
  label: string;
  /** 字段类型 */
  type: WmsFormFieldType;
  /** 默认值 */
  defaultValue?: any;
  /** 占位符 */
  placeholder?: string;
  /** 提示信息 */
  tooltip?: string;
  /** 帮助文本 */
  help?: string;
  /** 额外描述 */
  extra?: string;
  /** 是否必填 */
  required?: boolean;
  /** 是否禁用 */
  disabled?: boolean | ((formData: any) => boolean);
  /** 是否只读 */
  readonly?: boolean | ((formData: any) => boolean);
  /** 是否隐藏 */
  hidden?: boolean | ((formData: any) => boolean);
  /** 验证规则 */
  rules?: WmsFormRule[];
  /** 字段配置 */
  fieldConfig?: WmsFormFieldConfig;
  /** 栅格布局配置 */
  col?: {
    /** 栅格占据的列数 */
    span?: number;
    /** 栅格左侧的间隔格数 */
    offset?: number;
    /** 栅格向右移动格数 */
    push?: number;
    /** 栅格向左移动格数 */
    pull?: number;
    /** <768px 响应式栅格 */
    xs?: number | { span?: number; offset?: number };
    /** ≥768px 响应式栅格 */
    sm?: number | { span?: number; offset?: number };
    /** ≥992px 响应式栅格 */
    md?: number | { span?: number; offset?: number };
    /** ≥1200px 响应式栅格 */
    lg?: number | { span?: number; offset?: number };
    /** ≥1920px 响应式栅格 */
    xl?: number | { span?: number; offset?: number };
  };
  /** 依赖字段(字段联动) */
  dependencies?: string[];
  /** 联动规则 */
  linkage?: {
    /** 监听字段 */
    watch: string[];
    /** 联动处理函数 */
    handler: (values: any, formData: any) => Partial<WmsFormField>;
  };
  /** 自定义渲染函数 */
  render?: (formData: any, field: WmsFormField) => any;
  /** 自定义插槽名称 */
  slot?: string;
  /** 权限控制 */
  permission?: string | string[];
  /** 字段分组 */
  group?: string;
  /** 字段顺序 */
  order?: number;
}

/**
 * 表单字段具体配置类型
 */
export interface WmsFormFieldConfig {
  // 输入框配置
  input?: {
    /** 最大输入长度 */
    maxlength?: number;
    /** 最小输入长度 */
    minlength?: number;
    /** 是否显示输入字数统计 */
    showWordLimit?: boolean;
    /** 是否可清空 */
    clearable?: boolean;
    /** 是否显示密码图标 */
    showPassword?: boolean;
    /** 输入框前缀图标 */
    prefixIcon?: string;
    /** 输入框后缀图标 */
    suffixIcon?: string;
    /** 输入框前缀 */
    prepend?: string;
    /** 输入框后缀 */
    append?: string;
    /** 原生input的autocomplete属性 */
    autocomplete?: string;
    /** 格式化函数 */
    formatter?: (value: string) => string;
    /** 解析函数 */
    parser?: (value: string) => string;
  };

  // 数字输入框配置
  number?: {
    /** 最小值 */
    min?: number;
    /** 最大值 */
    max?: number;
    /** 数值精度 */
    precision?: number;
    /** 计数器步长 */
    step?: number;
    /** 是否只能输入step的倍数 */
    stepStrictly?: boolean;
    /** 是否显示控制按钮 */
    controls?: boolean;
    /** 控制按钮位置 */
    controlsPosition?: "right" | "";
  };

  // 选择器配置
  select?: {
    /** 选项列表 */
    options?: Array<{
      label: string;
      value: any;
      disabled?: boolean;
      group?: string;
    }>;
    /** 是否可搜索 */
    filterable?: boolean;
    /** 是否允许用户创建新条目 */
    allowCreate?: boolean;
    /** 是否可清空 */
    clearable?: boolean;
    /** 是否多选 */
    multiple?: boolean;
    /** 多选时用户最多可以选择的项目数 */
    multipleLimit?: number;
    /** 选择器下拉框的类名 */
    popperClass?: string;
    /** 远程搜索方法 */
    remoteMethod?: (query: string) => Promise<any[]> | any[];
    /** 是否从服务器远程加载 */
    remote?: boolean;
    /** 远程加载时显示的文字 */
    loadingText?: string;
    /** 搜索条件无匹配时显示的文字 */
    noMatchText?: string;
    /** 选项为空时显示的文字 */
    noDataText?: string;
    /** 自定义备选项的渲染模板 */
    optionRender?: (option: any) => any;
  };

  // 日期选择器配置
  date?: {
    /** 日期格式 */
    format?: string;
    /** 绑定值的格式 */
    valueFormat?: string;
    /** 是否只读 */
    readonly?: boolean;
    /** 是否禁用 */
    editable?: boolean;
    /** 是否可清空 */
    clearable?: boolean;
    /** 选择范围时的分隔符 */
    rangeSeparator?: string;
    /** 范围选择时开始日期的占位内容 */
    startPlaceholder?: string;
    /** 范围选择时结束日期的占位内容 */
    endPlaceholder?: string;
    /** 可选择的最小日期 */
    disabledDate?: (date: Date) => boolean;
    /** 设置快捷选项 */
    shortcuts?: Array<{
      text: string;
      value: Date | (() => Date);
    }>;
  };

  // 级联选择器配置
  cascader?: {
    /** 可选项数据源 */
    options?: any[];
    /** 配置选项 */
    props?: {
      expandTrigger?: "click" | "hover";
      multiple?: boolean;
      checkStrictly?: boolean;
      emitPath?: boolean;
      lazy?: boolean;
      lazyLoad?: (node: any, resolve: (data: any[]) => void) => void;
      value?: string;
      label?: string;
      children?: string;
      disabled?: string;
      leaf?: string;
    };
    /** 是否可搜索 */
    filterable?: boolean;
    /** 自定义搜索逻辑 */
    filterMethod?: (node: any, keyword: string) => boolean;
    /** 分隔符 */
    separator?: string;
    /** 是否显示完整路径 */
    showAllLevels?: boolean;
    /** 次级菜单的展开方式 */
    expandTrigger?: "click" | "hover";
  };

  // 树形选择器配置
  treeSelect?: {
    /** 树形数据 */
    data?: any[];
    /** 配置选项 */
    props?: {
      children?: string;
      label?: string;
      disabled?: string;
      isLeaf?: string;
    };
    /** 是否可搜索 */
    filterable?: boolean;
    /** 是否可清空 */
    clearable?: boolean;
    /** 是否支持多选 */
    multiple?: boolean;
    /** 是否显示复选框 */
    showCheckbox?: boolean;
    /** 在显示复选框的情况下，是否严格的遵循父子不互相关联的做法 */
    checkStrictly?: boolean;
    /** 是否默认展开所有节点 */
    defaultExpandAll?: boolean;
    /** 默认展开的节点的 key 的数组 */
    defaultExpandedKeys?: any[];
  };

  // 上传组件配置
  upload?: {
    /** 上传的地址 */
    action?: string;
    /** 上传的文件字段名 */
    name?: string;
    /** 设置上传的请求头部 */
    headers?: Record<string, any>;
    /** 上传时附带的额外参数 */
    data?: Record<string, any>;
    /** 接受上传的文件类型 */
    accept?: string;
    /** 是否支持多选文件 */
    multiple?: boolean;
    /** 最大允许上传个数 */
    limit?: number;
    /** 文件大小限制(MB) */
    sizeLimit?: number;
    /** 是否显示已上传文件列表 */
    showFileList?: boolean;
    /** 是否启用拖拽上传 */
    drag?: boolean;
    /** 列表的类型 */
    listType?: "text" | "picture" | "picture-card";
    /** 自定义上传方法 */
    httpRequest?: (options: any) => void;
    /** 上传前的钩子 */
    beforeUpload?: (file: File) => boolean | Promise<boolean>;
    /** 上传成功钩子 */
    onSuccess?: (response: any, file: File, fileList: any[]) => void;
    /** 上传失败钩子 */
    onError?: (error: Error, file: File, fileList: any[]) => void;
    /** 文件上传时的钩子 */
    onProgress?: (event: any, file: File, fileList: any[]) => void;
    /** 点击文件列表中已上传的文件时的钩子 */
    onPreview?: (file: File) => void;
    /** 文件列表移除文件时的钩子 */
    onRemove?: (file: File, fileList: any[]) => void;
  };

  // 富文本编辑器配置
  editor?: {
    /** 编辑器高度 */
    height?: number;
    /** 编辑器工具栏配置 */
    toolbar?: string[] | Record<string, any>;
    /** 是否只读 */
    readonly?: boolean;
    /** 上传图片配置 */
    uploadImage?: {
      server?: string;
      fieldName?: string;
      maxFileSize?: number;
      allowedFileTypes?: string[];
    };
  };

  // 其他组件配置
  [key: string]: any;
}

/**
 * 表单布局配置类型
 */
export interface WmsFormLayout {
  /** 表单布局方式 */
  layout?: "horizontal" | "vertical" | "inline";
  /** 标签的位置 */
  labelPosition?: "left" | "right" | "top";
  /** 标签的宽度 */
  labelWidth?: string | number;
  /** 表单域标签的后缀 */
  labelSuffix?: string;
  /** 是否隐藏必填字段的标签旁边的红色星号 */
  hideRequiredAsterisk?: boolean;
  /** 是否以行内形式展示校验信息 */
  inlineMessage?: boolean;
  /** 是否在输入框中显示校验结果反馈图标 */
  statusIcon?: boolean;
  /** 是否在 rules 改变后立即触发一次验证 */
  validateOnRuleChange?: boolean;
  /** 是否禁用该表单内的所有组件 */
  disabled?: boolean;
  /** 栅格间隔 */
  gutter?: number;
}

/**
 * 表单分组配置类型
 */
export interface WmsFormGroup {
  /** 分组名称 */
  name: string;
  /** 分组标题 */
  title: string;
  /** 分组描述 */
  description?: string;
  /** 是否可折叠 */
  collapsible?: boolean;
  /** 默认是否展开 */
  defaultExpanded?: boolean;
  /** 分组字段 */
  fields: string[];
  /** 分组顺序 */
  order?: number;
  /** 分组样式 */
  className?: string;
  /** 权限控制 */
  permission?: string | string[];
}

/**
 * 表单步骤配置类型
 */
export interface WmsFormStep {
  /** 步骤名称 */
  name: string;
  /** 步骤标题 */
  title: string;
  /** 步骤描述 */
  description?: string;
  /** 步骤图标 */
  icon?: string;
  /** 步骤字段 */
  fields: string[];
  /** 步骤验证函数 */
  validator?: (formData: any) => Promise<boolean> | boolean;
  /** 步骤顺序 */
  order?: number;
  /** 是否可跳过 */
  skippable?: boolean;
}

/**
 * 表单操作配置类型
 */
export interface WmsFormActions {
  /** 提交按钮配置 */
  submit?: {
    text?: string;
    loading?: boolean;
    disabled?: boolean;
    icon?: string;
    type?: "primary" | "success" | "warning" | "danger" | "info";
    permission?: string | string[];
    handler?: (formData: any) => Promise<void> | void;
  };
  /** 重置按钮配置 */
  reset?: {
    text?: string;
    icon?: string;
    type?: "primary" | "success" | "warning" | "danger" | "info";
    handler?: () => void;
  };
  /** 取消按钮配置 */
  cancel?: {
    text?: string;
    icon?: string;
    type?: "primary" | "success" | "warning" | "danger" | "info";
    handler?: () => void;
  };
  /** 自定义操作 */
  custom?: Array<{
    name: string;
    text: string;
    icon?: string;
    type?: "primary" | "success" | "warning" | "danger" | "info";
    permission?: string | string[];
    handler?: (formData: any) => Promise<void> | void;
  }>;
  /** 操作按钮对齐方式 */
  align?: "left" | "center" | "right";
  /** 是否显示在底部 */
  sticky?: boolean;
}

/**
 * 表单配置类型
 */
export interface WmsFormConfig extends WmsBaseComponentProps, WmsLoadingProps {
  /** 表单字段配置 */
  fields: WmsFormField[];
  /** 表单数据 */
  model: Record<string, any>;
  /** 表单布局 */
  layout?: WmsFormLayout;
  /** 表单分组 */
  groups?: WmsFormGroup[];
  /** 表单步骤 */
  steps?: WmsFormStep[];
  /** 表单操作 */
  actions?: WmsFormActions;
  /** 是否只读模式 */
  readonly?: boolean;
  /** 是否预览模式 */
  preview?: boolean;
  /** 表单标题 */
  title?: string;
  /** 表单描述 */
  description?: string;
  /** 提交前验证 */
  beforeSubmit?: (formData: any) => Promise<boolean> | boolean;
  /** 提交成功回调 */
  onSuccess?: (response: any, formData: any) => void;
  /** 提交失败回调 */
  onError?: (error: any, formData: any) => void;
  /** 字段值变化回调 */
  onChange?: (field: string, value: any, formData: any) => void;
  /** 表单验证回调 */
  onValidate?: (field: string, valid: boolean, message: string) => void;
}

/**
 * 表单实例方法类型
 */
export interface WmsFormMethods {
  /** 验证表单 */
  validate: (
    callback?: (valid: boolean, fields?: any) => void,
  ) => Promise<boolean>;
  /** 验证指定字段 */
  validateField: (
    fields: string | string[],
    callback?: (valid: boolean, fields?: any) => void,
  ) => Promise<boolean>;
  /** 重置表单 */
  resetFields: (fields?: string | string[]) => void;
  /** 清空验证信息 */
  clearValidate: (fields?: string | string[]) => void;
  /** 获取表单数据 */
  getFormData: () => any;
  /** 设置表单数据 */
  setFormData: (data: any) => void;
  /** 获取字段值 */
  getFieldValue: (field: string) => any;
  /** 设置字段值 */
  setFieldValue: (field: string, value: any) => void;
  /** 获取字段配置 */
  getFieldConfig: (field: string) => WmsFormField | undefined;
  /** 设置字段配置 */
  setFieldConfig: (field: string, config: Partial<WmsFormField>) => void;
  /** 显示字段 */
  showField: (field: string) => void;
  /** 隐藏字段 */
  hideField: (field: string) => void;
  /** 禁用字段 */
  disableField: (field: string) => void;
  /** 启用字段 */
  enableField: (field: string) => void;
  /** 设置字段只读 */
  setFieldReadonly: (field: string, readonly: boolean) => void;
  /** 触发字段联动 */
  triggerLinkage: (field: string) => void;
  /** 提交表单 */
  submit: () => Promise<any>;
  /** 重置表单 */
  reset: () => void;
}

/**
 * 表单插槽类型
 */
export interface WmsFormSlots {
  /** 表单头部插槽 */
  header?: () => any;
  /** 表单底部插槽 */
  footer?: () => any;
  /** 表单操作插槽 */
  actions?: () => any;
  /** 字段插槽 */
  [fieldName: string]:
    | ((scope: { field: WmsFormField; model: any }) => any)
    | undefined;
}
